package org.funtester.performance.books.chapter01.section4;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 双端列表在线程池应用功能示例
 */
public class DueueDemo {

    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10));// 创建线程池，使用双端列表
        for (int i = 0; i < 4; i++) {// 提交4个任务
            int index = i;// 任务索引,用于标识任务,由于lambda表达式中的变量必须是final或者等效的,所以这里使用局部变量
            Thread thread = new Thread(() -> {// 提交任务
                try {
                    Thread.sleep(1000);// 模拟任务执行,睡眠1秒,避免任务过快执行完毕
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + "  " + System.currentTimeMillis() + "  " + index + "  执行任务");// 打印任务执行信息
            });
            if (i == 3) {// 第4个任务插入到队列头部
                LinkedBlockingDeque<Runnable> queue = (LinkedBlockingDeque<Runnable>) executor.getQueue();// 获取线程池队列
                queue.offerFirst(thread);// 将任务插入到队列头部
            } else {
                executor.execute(thread);// 提交任务
            }
            System.out.println(Thread.currentThread().getName() + "  " + System.currentTimeMillis() + "  " + index + "  提交任务");// 打印任务提交信息
        }
        executor.shutdown();// 关闭线程池,不再接受新任务,但会执行完队列中的任务,并不会立即关闭
    }

}
